// list相关函数声明
#ifndef _LIST_H
#define _LIST_H

#include <stdio.h>
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

typedef struct Node {
    void *ptr;
    struct Node *next;
} Node;

typedef struct List {
    Node *head;
    int size;
} List;

typedef int (*compare)(const void* ptr1, const void* ptr2);

// 创建节点
Node* create_node(void *ptr);

// 创建链表
List* create_list(void);

// 销毁链表
void destroy_list(List* list);

// 晴空链表
void clear_list(List* list);

// 在链表尾部追加节点
void add_list_tail(List* list, void* ptr);

// 在链表头部添加节点
void add_list_head(List* list, void *ptr);

// 删除链表尾部节点
bool remove_list_tail_node(List *list);

// 删除链表头部节点
bool remove_list_head_node(List *list);

// 获取链表长度
size_t get_list_len(List *list);

// 在链表索引为index处插入节点
bool insert_list_node(List *list, int index, void* ptr);

// 获取链表索引为index的节点
Node* get_list_node_by_index(List* list, int index);

// 查找链表中值为value的节点
int get_list_node_by_value(List* list, void* ptr, compare cmp);

// 删除链表索引为index的节点
bool delete_list_node_by_index(List* list, int index);

// 按值删除节点
bool delete_list_node_by_value(List* list, void* ptr, compare cmp);

// 对链表进行排序
void sort_list(List* list, compare cmp);

void show_list(List* list, void (*show)(const void* ptr));

void show_index(List* list, int index, void (*show)(const void* ptr));

#endif
